cyclecad 3.10.4 → 3.12.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.
- package/.github/workflows/pages.yml +34 -0
- package/.nojekyll +0 -0
- package/CLAUDE.md +348 -3
- package/HANDOFF-2026-04-24-session-2.md +239 -0
- package/HANDOFF-2026-04-24.md +90 -0
- package/app/index.html +49 -10
- package/app/js/modules/ai-copilot.js +195 -2
- package/app/js/modules/ai-engineer.js +939 -0
- package/app/js/modules/pentacad-bridge.js +216 -0
- package/app/js/modules/pentacad-cam.js +184 -0
- package/app/js/modules/pentacad-sim.js +215 -0
- package/app/js/modules/pentacad.js +233 -0
- package/app/pentacad.html +240 -0
- package/cyclecad.html +1081 -0
- package/explodeview.html +1102 -0
- package/index-agent-first.html.bak +1306 -0
- package/index.html +1683 -1240
- package/machines/v2-50-chb/kinematics.json +51 -0
- package/mockups/cyclecad-suite-mockup.html +1746 -0
- package/package.json +1 -1
- package/pentacad.html +1097 -0
package/cyclecad.html
ADDED
|
@@ -0,0 +1,1081 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>cycleCAD — Parametric 3D CAD in a browser · cycleCAD Suite</title>
|
|
7
|
+
<meta name="description" content="cycleCAD: parametric 3D modeller with real B-rep kernel, 13 sketch tools, 12 constraints, AI Copilot, and Agent API. MIT-licensed. No install. Part of the cycleCAD Suite." />
|
|
8
|
+
<meta name="keywords" content="cycleCAD, browser CAD, parametric CAD, B-rep, OpenCascade, AI Copilot, Agent API, open source CAD, cycleCAD Suite" />
|
|
9
|
+
<meta name="author" content="Sachin Kumar" />
|
|
10
|
+
<link rel="canonical" href="https://cyclecad.com/cyclecad.html" />
|
|
11
|
+
<meta property="og:type" content="website" />
|
|
12
|
+
<meta property="og:site_name" content="cycleCAD Suite" />
|
|
13
|
+
<meta property="og:title" content="cycleCAD — Parametric 3D CAD in a browser" />
|
|
14
|
+
<meta property="og:description" content="Parametric CAD with real B-rep, 13 sketch tools, 12 constraints, AI Copilot, Agent API. MIT. In the browser." />
|
|
15
|
+
<meta property="og:url" content="https://cyclecad.com/cyclecad.html" />
|
|
16
|
+
<meta property="og:image" content="https://cyclecad.com/screenshot.png" />
|
|
17
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
18
|
+
<meta name="twitter:title" content="cycleCAD — Parametric 3D CAD in a browser" />
|
|
19
|
+
<meta name="twitter:description" content="Parametric CAD with real B-rep, 13 sketch tools, 12 constraints, AI Copilot, Agent API. MIT. In the browser." />
|
|
20
|
+
<meta name="twitter:image" content="https://cyclecad.com/screenshot.png" />
|
|
21
|
+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📐</text></svg>" />
|
|
22
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
23
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
24
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,700;9..144,900&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
|
|
25
|
+
|
|
26
|
+
<style>
|
|
27
|
+
/* ─────────────────────────────────────────────
|
|
28
|
+
DESIGN TOKENS — shared with suite landing
|
|
29
|
+
accent for this page: GOLD
|
|
30
|
+
───────────────────────────────────────────── */
|
|
31
|
+
:root {
|
|
32
|
+
--bg: #0A1628;
|
|
33
|
+
--bg-alt: #122240;
|
|
34
|
+
--bg-card: #1A2D50;
|
|
35
|
+
--border: #1E3A5F;
|
|
36
|
+
--border-hi: #2A4F80;
|
|
37
|
+
--text: #F0F0E8;
|
|
38
|
+
--text-2: #8B9AB5;
|
|
39
|
+
--text-3: #5A6B85;
|
|
40
|
+
--gold: #D4A843;
|
|
41
|
+
--gold-2: #E8C065;
|
|
42
|
+
--gold-3: rgba(212,168,67,0.14);
|
|
43
|
+
--blue: #2E86DE;
|
|
44
|
+
--teal: #3AAFA9;
|
|
45
|
+
--emerald: #10B981;
|
|
46
|
+
--emerald-2: #34D399;
|
|
47
|
+
--emerald-3: rgba(16,185,129,0.12);
|
|
48
|
+
--purple: #8B6FC0;
|
|
49
|
+
--amber: #F59E0B;
|
|
50
|
+
--red: #EF4444;
|
|
51
|
+
--t-fast: 0.18s;
|
|
52
|
+
--t-med: 0.35s;
|
|
53
|
+
--t-slow: 0.8s;
|
|
54
|
+
--ease: cubic-bezier(0.22, 0.61, 0.36, 1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
58
|
+
html { scroll-behavior: smooth; }
|
|
59
|
+
body {
|
|
60
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
61
|
+
font-weight: 400;
|
|
62
|
+
background: var(--bg);
|
|
63
|
+
color: var(--text);
|
|
64
|
+
line-height: 1.65;
|
|
65
|
+
overflow-x: hidden;
|
|
66
|
+
-webkit-font-smoothing: antialiased;
|
|
67
|
+
}
|
|
68
|
+
h1, h2, h3, h4 { font-family: 'Fraunces', Georgia, serif; font-weight: 700; line-height: 1.15; letter-spacing: -0.015em; color: var(--text); }
|
|
69
|
+
em { font-style: italic; color: var(--gold-2); font-weight: 700; }
|
|
70
|
+
code, pre { font-family: 'JetBrains Mono', ui-monospace, monospace; }
|
|
71
|
+
|
|
72
|
+
.wrap { max-width: 1280px; margin: 0 auto; padding: 0 32px; }
|
|
73
|
+
|
|
74
|
+
/* ─────────────────────────────────────────────
|
|
75
|
+
NAV — matches suite landing
|
|
76
|
+
───────────────────────────────────────────── */
|
|
77
|
+
nav {
|
|
78
|
+
position: sticky; top: 0; z-index: 50;
|
|
79
|
+
background: rgba(10, 22, 40, 0.72);
|
|
80
|
+
backdrop-filter: blur(20px) saturate(1.5);
|
|
81
|
+
border-bottom: 1px solid var(--border);
|
|
82
|
+
padding: 16px 0;
|
|
83
|
+
}
|
|
84
|
+
nav .wrap { display: flex; align-items: center; justify-content: space-between; gap: 24px; }
|
|
85
|
+
.brand { display: inline-flex; align-items: center; gap: 10px; font-family: 'Fraunces', serif; font-weight: 700; font-size: 1.12rem; color: var(--text); text-decoration: none; }
|
|
86
|
+
.brand .logo { display: inline-grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: linear-gradient(135deg, var(--gold), var(--blue)); color: var(--bg); font-size: 0.9rem; }
|
|
87
|
+
.brand em { color: var(--gold); font-style: italic; }
|
|
88
|
+
nav .links { display: flex; align-items: center; gap: 24px; font-size: 0.95rem; }
|
|
89
|
+
nav .links a { color: var(--text-2); text-decoration: none; transition: color var(--t-fast); }
|
|
90
|
+
nav .links a:hover { color: var(--text); }
|
|
91
|
+
nav .links a.cta {
|
|
92
|
+
background: linear-gradient(135deg, var(--gold), var(--blue));
|
|
93
|
+
color: var(--bg); padding: 8px 16px; border-radius: 24px;
|
|
94
|
+
font-weight: 600; transition: transform var(--t-fast), box-shadow var(--t-fast);
|
|
95
|
+
}
|
|
96
|
+
nav .links a.cta:hover { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(212,168,67,0.32); }
|
|
97
|
+
@media (max-width: 720px) { nav .links a:not(.cta) { display: none; } }
|
|
98
|
+
|
|
99
|
+
/* ─────────────────────────────────────────────
|
|
100
|
+
HERO
|
|
101
|
+
───────────────────────────────────────────── */
|
|
102
|
+
.hero {
|
|
103
|
+
position: relative;
|
|
104
|
+
padding: 120px 0 100px;
|
|
105
|
+
background:
|
|
106
|
+
radial-gradient(ellipse 1000px 450px at 20% 0%, rgba(212,168,67,0.14), transparent 60%),
|
|
107
|
+
radial-gradient(ellipse 800px 350px at 80% 30%, rgba(46,134,222,0.1), transparent 60%),
|
|
108
|
+
var(--bg);
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
}
|
|
111
|
+
.hero::before {
|
|
112
|
+
content: ''; position: absolute; inset: 0;
|
|
113
|
+
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><circle cx='1' cy='1' r='0.6' fill='%232A4F80'/></svg>");
|
|
114
|
+
opacity: 0.35; pointer-events: none;
|
|
115
|
+
}
|
|
116
|
+
.hero .wrap { position: relative; z-index: 1; display: grid; grid-template-columns: 1.1fr 1fr; gap: 72px; align-items: center; }
|
|
117
|
+
.hero .kicker {
|
|
118
|
+
display: inline-flex; align-items: center; gap: 8px;
|
|
119
|
+
padding: 6px 14px; border-radius: 24px; font-size: 0.78rem; font-weight: 600;
|
|
120
|
+
color: var(--gold-2); background: var(--gold-3); border: 1px solid rgba(212,168,67,0.35);
|
|
121
|
+
letter-spacing: 0.6px; text-transform: uppercase; margin-bottom: 24px;
|
|
122
|
+
}
|
|
123
|
+
.hero .kicker .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--gold-2); animation: dotPulse 1.8s ease-in-out infinite; box-shadow: 0 0 12px var(--gold); }
|
|
124
|
+
@keyframes dotPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
|
|
125
|
+
.hero h1 { font-size: clamp(2.6rem, 5vw, 4.2rem); max-width: 660px; margin-bottom: 24px; font-weight: 900; }
|
|
126
|
+
.hero p.lead { font-size: 1.2rem; color: var(--text-2); max-width: 620px; margin-bottom: 36px; }
|
|
127
|
+
.hero .ctas { display: flex; gap: 14px; flex-wrap: wrap; }
|
|
128
|
+
.btn {
|
|
129
|
+
display: inline-flex; align-items: center; gap: 10px;
|
|
130
|
+
padding: 14px 26px; border-radius: 30px; font-weight: 600; font-size: 0.98rem;
|
|
131
|
+
text-decoration: none; transition: transform var(--t-fast), box-shadow var(--t-fast), background var(--t-fast);
|
|
132
|
+
}
|
|
133
|
+
.btn-primary { background: linear-gradient(135deg, var(--gold), var(--blue)); color: var(--bg); }
|
|
134
|
+
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 10px 30px rgba(212,168,67,0.35); }
|
|
135
|
+
.btn-secondary { background: transparent; color: var(--text); border: 1px solid var(--border-hi); }
|
|
136
|
+
.btn-secondary:hover { background: rgba(255,255,255,0.04); border-color: var(--gold); color: var(--gold-2); }
|
|
137
|
+
.btn .arrow { transition: transform var(--t-fast); }
|
|
138
|
+
.btn:hover .arrow { transform: translateX(4px); }
|
|
139
|
+
|
|
140
|
+
/* Hero visual — rotating wireframe cube with dimension lines */
|
|
141
|
+
.hero-visual {
|
|
142
|
+
position: relative; aspect-ratio: 1 / 1; max-width: 440px; justify-self: end;
|
|
143
|
+
background: radial-gradient(circle at 50% 40%, rgba(212,168,67,0.08), transparent 70%);
|
|
144
|
+
border-radius: 50%;
|
|
145
|
+
}
|
|
146
|
+
.hero-visual svg { width: 100%; height: 100%; }
|
|
147
|
+
.hero-visual .cube-spin { transform-origin: 50% 50%; animation: cubeSpin 24s linear infinite; }
|
|
148
|
+
@keyframes cubeSpin { to { transform: rotate(360deg); } }
|
|
149
|
+
.hero-visual .dim-line { stroke-dasharray: 3 4; animation: dimShift 10s linear infinite; }
|
|
150
|
+
@keyframes dimShift { to { stroke-dashoffset: -140; } }
|
|
151
|
+
.hero-visual .spark { transform-origin: 50% 50%; animation: sparkPulse 2.6s ease-in-out infinite; }
|
|
152
|
+
@keyframes sparkPulse { 0%, 100% { opacity: 0.5; transform: scale(1); } 50% { opacity: 1; transform: scale(1.08); } }
|
|
153
|
+
|
|
154
|
+
@media (max-width: 920px) {
|
|
155
|
+
.hero { padding: 80px 0 60px; }
|
|
156
|
+
.hero .wrap { grid-template-columns: 1fr; gap: 40px; }
|
|
157
|
+
.hero-visual { max-width: 360px; justify-self: center; }
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* ─────────────────────────────────────────────
|
|
161
|
+
PROBLEM STRIP
|
|
162
|
+
───────────────────────────────────────────── */
|
|
163
|
+
.problem {
|
|
164
|
+
padding: 70px 0;
|
|
165
|
+
background: var(--bg-alt);
|
|
166
|
+
border-top: 1px solid var(--border);
|
|
167
|
+
border-bottom: 1px solid var(--border);
|
|
168
|
+
}
|
|
169
|
+
.problem h2 { font-size: clamp(1.6rem, 3vw, 2.2rem); max-width: 820px; margin: 0 auto 14px; text-align: center; }
|
|
170
|
+
.problem .sub { color: var(--text-2); text-align: center; max-width: 720px; margin: 0 auto 40px; }
|
|
171
|
+
.problem-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
|
|
172
|
+
.problem-card {
|
|
173
|
+
padding: 18px 16px; border-radius: 12px;
|
|
174
|
+
background: var(--bg); border: 1px solid var(--border);
|
|
175
|
+
text-align: center;
|
|
176
|
+
}
|
|
177
|
+
.problem-card .icon {
|
|
178
|
+
width: 38px; height: 38px; display: grid; place-items: center; margin: 0 auto 10px;
|
|
179
|
+
border-radius: 10px; background: rgba(239,68,68,0.12); color: var(--red); font-size: 1.2rem;
|
|
180
|
+
}
|
|
181
|
+
.problem-card .ttl { font-weight: 600; font-size: 0.95rem; margin-bottom: 4px; color: var(--text); }
|
|
182
|
+
.problem-card .sub { font-size: 0.78rem; color: var(--text-3); margin-bottom: 0; }
|
|
183
|
+
@media (max-width: 900px) { .problem-grid { grid-template-columns: repeat(3, 1fr); } .problem-card:nth-child(4), .problem-card:nth-child(5) { grid-column: span 1; } }
|
|
184
|
+
@media (max-width: 560px) { .problem-grid { grid-template-columns: repeat(2, 1fr); } }
|
|
185
|
+
|
|
186
|
+
.vs-line {
|
|
187
|
+
position: relative; margin: 40px 0 0; text-align: center;
|
|
188
|
+
font-family: 'Fraunces', serif; font-style: italic; font-size: 1.15rem; color: var(--text-2);
|
|
189
|
+
}
|
|
190
|
+
.vs-line::before, .vs-line::after {
|
|
191
|
+
content: ''; display: inline-block; width: 64px; height: 1px;
|
|
192
|
+
background: linear-gradient(to right, transparent, var(--border-hi));
|
|
193
|
+
vertical-align: middle; margin: 0 12px;
|
|
194
|
+
}
|
|
195
|
+
.vs-line::after { background: linear-gradient(to left, transparent, var(--border-hi)); }
|
|
196
|
+
|
|
197
|
+
/* ─────────────────────────────────────────────
|
|
198
|
+
SOLUTION — five modules
|
|
199
|
+
───────────────────────────────────────────── */
|
|
200
|
+
.solution { padding: 100px 0; }
|
|
201
|
+
.solution .header-block { text-align: center; max-width: 760px; margin: 0 auto 60px; }
|
|
202
|
+
.section-kicker {
|
|
203
|
+
display: inline-block; font-size: 0.72rem; letter-spacing: 2.5px; text-transform: uppercase;
|
|
204
|
+
color: var(--gold-2); font-weight: 700; margin-bottom: 16px;
|
|
205
|
+
}
|
|
206
|
+
.solution h2 { font-size: clamp(2rem, 4vw, 3rem); margin-bottom: 16px; }
|
|
207
|
+
.solution p.sub { color: var(--text-2); font-size: 1.08rem; }
|
|
208
|
+
|
|
209
|
+
.five-modules { display: grid; grid-template-columns: repeat(5, 1fr); gap: 20px; }
|
|
210
|
+
.mod-card {
|
|
211
|
+
position: relative;
|
|
212
|
+
padding: 28px 22px; border-radius: 16px;
|
|
213
|
+
background: var(--bg-alt); border: 1px solid var(--border);
|
|
214
|
+
transition: transform var(--t-med), border-color var(--t-med), box-shadow var(--t-med);
|
|
215
|
+
}
|
|
216
|
+
.mod-card:hover {
|
|
217
|
+
transform: translateY(-4px);
|
|
218
|
+
border-color: rgba(212,168,67,0.4);
|
|
219
|
+
box-shadow: 0 12px 32px rgba(212,168,67,0.15);
|
|
220
|
+
}
|
|
221
|
+
.mod-num {
|
|
222
|
+
display: inline-grid; place-items: center;
|
|
223
|
+
width: 28px; height: 28px; border-radius: 8px;
|
|
224
|
+
background: var(--gold-3); color: var(--gold-2);
|
|
225
|
+
font: 700 0.82rem 'JetBrains Mono'; margin-bottom: 14px;
|
|
226
|
+
}
|
|
227
|
+
.mod-card h3 { font-size: 1.05rem; font-family: 'Inter', sans-serif; font-weight: 700; margin-bottom: 8px; }
|
|
228
|
+
.mod-card p { font-size: 0.88rem; color: var(--text-2); line-height: 1.55; }
|
|
229
|
+
@media (max-width: 920px) { .five-modules { grid-template-columns: repeat(2, 1fr); } }
|
|
230
|
+
@media (max-width: 520px) { .five-modules { grid-template-columns: 1fr; } }
|
|
231
|
+
|
|
232
|
+
/* ─────────────────────────────────────────────
|
|
233
|
+
STRATEGIES GRID — constraints
|
|
234
|
+
───────────────────────────────────────────── */
|
|
235
|
+
.strategies { padding: 100px 0; background: var(--bg-alt); }
|
|
236
|
+
.strategies .header-block { text-align: center; max-width: 700px; margin: 0 auto 50px; }
|
|
237
|
+
.strategies h2 { font-size: clamp(2rem, 4vw, 2.8rem); margin-bottom: 14px; }
|
|
238
|
+
.strategies p.sub { color: var(--text-2); }
|
|
239
|
+
.strat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
|
|
240
|
+
.strat-card {
|
|
241
|
+
padding: 22px 20px; border-radius: 14px;
|
|
242
|
+
background: var(--bg); border: 1px solid var(--border);
|
|
243
|
+
transition: all var(--t-med);
|
|
244
|
+
}
|
|
245
|
+
.strat-card:hover { border-color: var(--gold); transform: translateY(-3px); }
|
|
246
|
+
.strat-card .icon {
|
|
247
|
+
width: 40px; height: 40px; border-radius: 10px;
|
|
248
|
+
background: var(--gold-3); margin-bottom: 14px;
|
|
249
|
+
display: grid; place-items: center;
|
|
250
|
+
}
|
|
251
|
+
.strat-card .icon svg { width: 20px; height: 20px; stroke: var(--gold-2); stroke-width: 2; fill: none; }
|
|
252
|
+
.strat-card h4 { font-size: 1rem; font-family: 'Inter', sans-serif; font-weight: 700; margin-bottom: 4px; }
|
|
253
|
+
.strat-card .kind { font-size: 0.72rem; font-family: 'JetBrains Mono'; color: var(--text-3); text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
|
|
254
|
+
.strat-card p { font-size: 0.84rem; color: var(--text-2); line-height: 1.5; }
|
|
255
|
+
@media (max-width: 920px) { .strat-grid { grid-template-columns: repeat(2, 1fr); } }
|
|
256
|
+
@media (max-width: 520px) { .strat-grid { grid-template-columns: 1fr; } }
|
|
257
|
+
|
|
258
|
+
/* ─────────────────────────────────────────────
|
|
259
|
+
B-REP SECTION — side-by-side with code sample
|
|
260
|
+
───────────────────────────────────────────── */
|
|
261
|
+
.post-section { padding: 100px 0; }
|
|
262
|
+
.post-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center; }
|
|
263
|
+
.post-body h2 { font-size: clamp(1.9rem, 3.5vw, 2.6rem); margin-bottom: 16px; }
|
|
264
|
+
.post-body p { color: var(--text-2); margin-bottom: 14px; font-size: 1.02rem; }
|
|
265
|
+
.post-body .feature-list { list-style: none; margin-top: 26px; }
|
|
266
|
+
.post-body .feature-list li {
|
|
267
|
+
position: relative; padding-left: 24px; margin-bottom: 10px;
|
|
268
|
+
color: var(--text); font-size: 0.95rem;
|
|
269
|
+
}
|
|
270
|
+
.post-body .feature-list li::before {
|
|
271
|
+
content: '✓'; position: absolute; left: 0; top: 0;
|
|
272
|
+
width: 16px; height: 16px; background: var(--gold-3); color: var(--gold-2);
|
|
273
|
+
border-radius: 4px; display: grid; place-items: center;
|
|
274
|
+
font-size: 0.78rem; font-weight: 700;
|
|
275
|
+
}
|
|
276
|
+
.post-body code.inline {
|
|
277
|
+
background: var(--bg-card); color: var(--gold-2); padding: 2px 7px; border-radius: 4px;
|
|
278
|
+
font-size: 0.88em;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.ngc-block {
|
|
282
|
+
position: relative;
|
|
283
|
+
background: var(--bg-alt);
|
|
284
|
+
border: 1px solid var(--border); border-radius: 14px;
|
|
285
|
+
overflow: hidden;
|
|
286
|
+
font-family: 'JetBrains Mono', ui-monospace, monospace;
|
|
287
|
+
font-size: 0.82rem;
|
|
288
|
+
}
|
|
289
|
+
.ngc-block .hd {
|
|
290
|
+
padding: 10px 16px; background: var(--bg-card);
|
|
291
|
+
border-bottom: 1px solid var(--border);
|
|
292
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
293
|
+
color: var(--text-2); font-size: 0.78rem; letter-spacing: 1px; text-transform: uppercase;
|
|
294
|
+
}
|
|
295
|
+
.ngc-block .hd .dots { display: inline-flex; gap: 5px; }
|
|
296
|
+
.ngc-block .hd .dots span { width: 9px; height: 9px; border-radius: 50%; background: var(--border-hi); }
|
|
297
|
+
.ngc-block pre {
|
|
298
|
+
padding: 18px 18px 22px;
|
|
299
|
+
color: var(--text); line-height: 1.6;
|
|
300
|
+
overflow-x: auto; white-space: pre;
|
|
301
|
+
}
|
|
302
|
+
.ngc-block .kw { color: var(--gold-2); }
|
|
303
|
+
.ngc-block .val { color: var(--emerald-2); }
|
|
304
|
+
.ngc-block .cm { color: var(--text-3); font-style: italic; }
|
|
305
|
+
.ngc-block .ax { color: var(--blue); }
|
|
306
|
+
.ngc-block .str { color: var(--teal); }
|
|
307
|
+
@media (max-width: 900px) { .post-layout { grid-template-columns: 1fr; gap: 40px; } }
|
|
308
|
+
|
|
309
|
+
/* ─────────────────────────────────────────────
|
|
310
|
+
AI COPILOT SECTION
|
|
311
|
+
───────────────────────────────────────────── */
|
|
312
|
+
.sim-section { padding: 100px 0; background: var(--bg-alt); }
|
|
313
|
+
.sim-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center; }
|
|
314
|
+
.sim-layout.rev > :first-child { order: 2; }
|
|
315
|
+
.sim-visual {
|
|
316
|
+
aspect-ratio: 1.1 / 1;
|
|
317
|
+
background: radial-gradient(circle at 50% 50%, rgba(212,168,67,0.08), transparent 70%);
|
|
318
|
+
border-radius: 20px; border: 1px solid var(--border);
|
|
319
|
+
position: relative; overflow: hidden;
|
|
320
|
+
padding: 22px;
|
|
321
|
+
}
|
|
322
|
+
.copilot-term {
|
|
323
|
+
height: 100%; width: 100%;
|
|
324
|
+
background: var(--bg);
|
|
325
|
+
border: 1px solid var(--border);
|
|
326
|
+
border-radius: 10px;
|
|
327
|
+
padding: 14px 16px;
|
|
328
|
+
font-family: 'JetBrains Mono', monospace;
|
|
329
|
+
font-size: 0.82rem;
|
|
330
|
+
color: var(--text);
|
|
331
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
332
|
+
overflow: hidden;
|
|
333
|
+
}
|
|
334
|
+
.copilot-term .term-hd {
|
|
335
|
+
display: flex; align-items: center; gap: 8px;
|
|
336
|
+
padding-bottom: 8px; border-bottom: 1px solid var(--border);
|
|
337
|
+
color: var(--text-3); font-size: 0.72rem; letter-spacing: 1px; text-transform: uppercase;
|
|
338
|
+
}
|
|
339
|
+
.copilot-term .term-hd .dots span { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--border-hi); margin-right: 4px; }
|
|
340
|
+
.copilot-term .term-hd .ti { margin-left: auto; }
|
|
341
|
+
.copilot-term .tin { color: var(--gold-2); }
|
|
342
|
+
.copilot-term .prompt { color: var(--text); }
|
|
343
|
+
.copilot-term .prompt::before { content: '> '; color: var(--gold); }
|
|
344
|
+
.copilot-term .cursor { display: inline-block; width: 7px; height: 14px; background: var(--gold-2); vertical-align: middle; animation: cursorBlink 1.1s step-end infinite; margin-left: 2px; }
|
|
345
|
+
@keyframes cursorBlink { 0%, 50% { opacity: 1; } 50.01%, 100% { opacity: 0; } }
|
|
346
|
+
.copilot-term .step {
|
|
347
|
+
display: flex; align-items: center; gap: 8px;
|
|
348
|
+
padding: 3px 0; opacity: 0;
|
|
349
|
+
animation: stepFade 8s ease-in-out infinite;
|
|
350
|
+
}
|
|
351
|
+
.copilot-term .step .chk {
|
|
352
|
+
width: 16px; height: 16px; border-radius: 50%;
|
|
353
|
+
background: var(--emerald-3); color: var(--emerald-2);
|
|
354
|
+
display: grid; place-items: center;
|
|
355
|
+
font-size: 0.72rem; font-weight: 700;
|
|
356
|
+
flex-shrink: 0;
|
|
357
|
+
}
|
|
358
|
+
.copilot-term .step.s1 { animation-delay: 1.1s; }
|
|
359
|
+
.copilot-term .step.s2 { animation-delay: 2.0s; }
|
|
360
|
+
.copilot-term .step.s3 { animation-delay: 2.9s; }
|
|
361
|
+
.copilot-term .step.s4 { animation-delay: 3.8s; }
|
|
362
|
+
.copilot-term .step.s5 { animation-delay: 4.7s; }
|
|
363
|
+
.copilot-term .result { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); color: var(--gold-2); opacity: 0; animation: stepFade 8s ease-in-out infinite; animation-delay: 5.6s; }
|
|
364
|
+
@keyframes stepFade {
|
|
365
|
+
0%, 8% { opacity: 0; transform: translateX(-6px); }
|
|
366
|
+
12%, 82% { opacity: 1; transform: translateX(0); }
|
|
367
|
+
90%, 100% { opacity: 0.9; transform: translateX(0); }
|
|
368
|
+
}
|
|
369
|
+
.copilot-term .kw { color: var(--gold-2); }
|
|
370
|
+
.copilot-term .val { color: var(--emerald-2); }
|
|
371
|
+
.copilot-term .cm { color: var(--text-3); font-style: italic; }
|
|
372
|
+
|
|
373
|
+
.sim-body h2 { font-size: clamp(1.9rem, 3.5vw, 2.6rem); margin-bottom: 16px; }
|
|
374
|
+
.sim-body p { color: var(--text-2); margin-bottom: 14px; font-size: 1.02rem; }
|
|
375
|
+
.sim-body .feature-list { list-style: none; margin-top: 22px; }
|
|
376
|
+
.sim-body .feature-list li { position: relative; padding-left: 24px; margin-bottom: 10px; font-size: 0.95rem; }
|
|
377
|
+
.sim-body .feature-list li::before {
|
|
378
|
+
content: '✓'; position: absolute; left: 0; top: 0;
|
|
379
|
+
width: 16px; height: 16px; background: var(--gold-3); color: var(--gold-2);
|
|
380
|
+
border-radius: 4px; display: grid; place-items: center;
|
|
381
|
+
font-size: 0.78rem; font-weight: 700;
|
|
382
|
+
}
|
|
383
|
+
@media (max-width: 900px) {
|
|
384
|
+
.sim-layout { grid-template-columns: 1fr; gap: 40px; }
|
|
385
|
+
.sim-layout.rev > :first-child { order: 0; }
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/* ─────────────────────────────────────────────
|
|
389
|
+
AGENT API SECTION — diagram + namespaces
|
|
390
|
+
───────────────────────────────────────────── */
|
|
391
|
+
.bridge { padding: 100px 0; }
|
|
392
|
+
.bridge .header-block { text-align: center; max-width: 760px; margin: 0 auto 60px; }
|
|
393
|
+
.bridge h2 { font-size: clamp(1.9rem, 3.8vw, 2.7rem); margin-bottom: 16px; }
|
|
394
|
+
.bridge p.sub { color: var(--text-2); font-size: 1.05rem; }
|
|
395
|
+
.bridge-diagram {
|
|
396
|
+
position: relative;
|
|
397
|
+
padding: 60px 40px;
|
|
398
|
+
border-radius: 20px;
|
|
399
|
+
background: var(--bg-alt); border: 1px solid var(--border);
|
|
400
|
+
}
|
|
401
|
+
.bridge-row { display: grid; grid-template-columns: 1fr 90px 1fr 90px 1fr; align-items: center; gap: 16px; }
|
|
402
|
+
.bridge-node {
|
|
403
|
+
padding: 22px 18px; border-radius: 14px;
|
|
404
|
+
background: var(--bg); border: 1px solid var(--border);
|
|
405
|
+
text-align: center;
|
|
406
|
+
}
|
|
407
|
+
.bridge-node .icn { font-size: 1.6rem; margin-bottom: 8px; }
|
|
408
|
+
.bridge-node h4 { font-size: 0.98rem; font-family: 'Inter', sans-serif; font-weight: 700; margin-bottom: 4px; }
|
|
409
|
+
.bridge-node .ttag { display: inline-block; font-size: 0.72rem; font-family: 'JetBrains Mono'; color: var(--text-3); }
|
|
410
|
+
.bridge-arrow { position: relative; height: 2px; background: linear-gradient(to right, var(--border-hi), var(--gold), var(--border-hi)); border-radius: 2px; }
|
|
411
|
+
.bridge-arrow::after {
|
|
412
|
+
content: ''; position: absolute; right: -2px; top: 50%; transform: translateY(-50%);
|
|
413
|
+
border-left: 8px solid var(--gold); border-top: 5px solid transparent; border-bottom: 5px solid transparent;
|
|
414
|
+
}
|
|
415
|
+
.bridge-arrow .packet {
|
|
416
|
+
position: absolute; top: 50%; left: 0; transform: translateY(-50%);
|
|
417
|
+
width: 10px; height: 10px; border-radius: 50%; background: var(--gold);
|
|
418
|
+
box-shadow: 0 0 14px var(--gold);
|
|
419
|
+
animation: packetFly 2.2s ease-in-out infinite;
|
|
420
|
+
}
|
|
421
|
+
.bridge-arrow .packet.p2 { animation-delay: 0.8s; }
|
|
422
|
+
@keyframes packetFly { 0% { left: 0; opacity: 0; } 10% { opacity: 1; } 80% { opacity: 1; } 100% { left: calc(100% - 10px); opacity: 0; } }
|
|
423
|
+
.bridge-caption { text-align: center; margin-top: 30px; color: var(--text-2); font-size: 0.92rem; }
|
|
424
|
+
.bridge-caption code { background: var(--bg-card); color: var(--gold-2); padding: 2px 7px; border-radius: 4px; font-size: 0.88em; }
|
|
425
|
+
|
|
426
|
+
.namespaces {
|
|
427
|
+
margin-top: 36px;
|
|
428
|
+
display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;
|
|
429
|
+
}
|
|
430
|
+
.ns-chip {
|
|
431
|
+
padding: 8px 16px; border-radius: 24px;
|
|
432
|
+
background: var(--bg-card); border: 1px solid var(--border);
|
|
433
|
+
font-family: 'JetBrains Mono', monospace; font-size: 0.84rem;
|
|
434
|
+
color: var(--text);
|
|
435
|
+
transition: all var(--t-fast);
|
|
436
|
+
}
|
|
437
|
+
.ns-chip:hover { border-color: var(--gold); color: var(--gold-2); transform: translateY(-2px); }
|
|
438
|
+
.ns-chip .ns-dot { color: var(--gold-2); }
|
|
439
|
+
|
|
440
|
+
@media (max-width: 900px) {
|
|
441
|
+
.bridge-row { grid-template-columns: 1fr; gap: 8px; }
|
|
442
|
+
.bridge-arrow { height: 36px; width: 2px; margin: 0 auto; background: linear-gradient(to bottom, var(--border-hi), var(--gold), var(--border-hi)); }
|
|
443
|
+
.bridge-arrow::after { right: 50%; top: auto; bottom: -2px; transform: translateX(50%); border: 0; border-top: 8px solid var(--gold); border-left: 5px solid transparent; border-right: 5px solid transparent; }
|
|
444
|
+
.bridge-arrow .packet { animation: packetFlyV 2.2s ease-in-out infinite; }
|
|
445
|
+
}
|
|
446
|
+
@keyframes packetFlyV { 0% { top: 0; opacity: 0; } 10% { opacity: 1; } 80% { opacity: 1; } 100% { top: calc(100% - 10px); opacity: 0; } }
|
|
447
|
+
|
|
448
|
+
/* ─────────────────────────────────────────────
|
|
449
|
+
ROADMAP — phased timeline
|
|
450
|
+
───────────────────────────────────────────── */
|
|
451
|
+
.roadmap { padding: 100px 0; background: var(--bg-alt); }
|
|
452
|
+
.roadmap .header-block { text-align: center; max-width: 720px; margin: 0 auto 60px; }
|
|
453
|
+
.roadmap h2 { font-size: clamp(1.9rem, 3.5vw, 2.6rem); margin-bottom: 14px; }
|
|
454
|
+
.roadmap p.sub { color: var(--text-2); }
|
|
455
|
+
|
|
456
|
+
.phases { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; position: relative; }
|
|
457
|
+
.phases::before {
|
|
458
|
+
content: ''; position: absolute; top: 45px; left: 8%; right: 8%; height: 2px;
|
|
459
|
+
background: linear-gradient(to right, var(--gold), var(--amber), var(--border-hi), var(--border-hi));
|
|
460
|
+
z-index: 0;
|
|
461
|
+
}
|
|
462
|
+
.phase {
|
|
463
|
+
position: relative; z-index: 1;
|
|
464
|
+
padding: 24px 20px; border-radius: 14px;
|
|
465
|
+
background: var(--bg); border: 1px solid var(--border);
|
|
466
|
+
}
|
|
467
|
+
.phase-dot {
|
|
468
|
+
width: 18px; height: 18px; border-radius: 50%;
|
|
469
|
+
margin: 0 auto 12px; border: 3px solid var(--bg);
|
|
470
|
+
box-shadow: 0 0 0 2px var(--border-hi);
|
|
471
|
+
}
|
|
472
|
+
.phase.done .phase-dot { background: var(--gold); box-shadow: 0 0 0 2px var(--gold); }
|
|
473
|
+
.phase.active .phase-dot { background: var(--amber); box-shadow: 0 0 0 2px var(--amber); animation: pulseDot 1.8s ease-in-out infinite; }
|
|
474
|
+
.phase.next .phase-dot { background: var(--bg-card); box-shadow: 0 0 0 2px var(--border-hi); }
|
|
475
|
+
@keyframes pulseDot { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.22); } }
|
|
476
|
+
.phase-num {
|
|
477
|
+
display: block; font-family: 'JetBrains Mono'; font-size: 0.78rem;
|
|
478
|
+
color: var(--text-3); letter-spacing: 1.5px; text-align: center; margin-bottom: 4px; text-transform: uppercase;
|
|
479
|
+
}
|
|
480
|
+
.phase h4 { text-align: center; font-size: 1rem; font-family: 'Inter', sans-serif; font-weight: 700; margin-bottom: 10px; }
|
|
481
|
+
.phase ul { list-style: none; }
|
|
482
|
+
.phase li { font-size: 0.82rem; color: var(--text-2); padding: 4px 0; border-bottom: 1px dashed var(--border); }
|
|
483
|
+
.phase li:last-child { border-bottom: 0; }
|
|
484
|
+
.phase.done { border-color: rgba(212,168,67,0.35); }
|
|
485
|
+
.phase.active { border-color: rgba(245,158,11,0.4); }
|
|
486
|
+
@media (max-width: 920px) { .phases { grid-template-columns: repeat(2, 1fr); } .phases::before { display: none; } }
|
|
487
|
+
@media (max-width: 520px) { .phases { grid-template-columns: 1fr; } }
|
|
488
|
+
|
|
489
|
+
/* ─────────────────────────────────────────────
|
|
490
|
+
FINAL CTA
|
|
491
|
+
───────────────────────────────────────────── */
|
|
492
|
+
.cta-final {
|
|
493
|
+
padding: 110px 0;
|
|
494
|
+
background:
|
|
495
|
+
radial-gradient(ellipse 800px 400px at 50% 50%, rgba(212,168,67,0.14), transparent 60%),
|
|
496
|
+
var(--bg);
|
|
497
|
+
text-align: center;
|
|
498
|
+
}
|
|
499
|
+
.cta-final h2 { font-size: clamp(2rem, 4vw, 3rem); max-width: 780px; margin: 0 auto 16px; }
|
|
500
|
+
.cta-final p { color: var(--text-2); max-width: 680px; margin: 0 auto 36px; font-size: 1.05rem; }
|
|
501
|
+
.cta-final .ctas { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
|
|
502
|
+
.cta-final .tiny {
|
|
503
|
+
margin-top: 26px;
|
|
504
|
+
color: var(--text-3); font-size: 0.82rem;
|
|
505
|
+
}
|
|
506
|
+
.cta-final .tiny a { color: var(--text-2); text-decoration: underline; text-decoration-color: var(--border-hi); }
|
|
507
|
+
.cta-final .tiny a:hover { color: var(--gold-2); }
|
|
508
|
+
|
|
509
|
+
/* ─────────────────────────────────────────────
|
|
510
|
+
FOOTER — same as suite landing
|
|
511
|
+
───────────────────────────────────────────── */
|
|
512
|
+
footer {
|
|
513
|
+
padding: 70px 0 40px;
|
|
514
|
+
background: var(--bg-alt);
|
|
515
|
+
border-top: 1px solid var(--border);
|
|
516
|
+
font-size: 0.9rem;
|
|
517
|
+
}
|
|
518
|
+
footer .row {
|
|
519
|
+
display: grid; grid-template-columns: 1.8fr 1fr 1fr 1fr 1fr; gap: 40px;
|
|
520
|
+
padding-bottom: 40px; border-bottom: 1px solid var(--border);
|
|
521
|
+
}
|
|
522
|
+
footer .brand-col p { color: var(--text-2); font-size: 0.92rem; margin-top: 14px; max-width: 320px; }
|
|
523
|
+
footer .col h4 {
|
|
524
|
+
font-size: 0.78rem; font-family: 'Inter', sans-serif; font-weight: 700;
|
|
525
|
+
text-transform: uppercase; letter-spacing: 1.5px; color: var(--text-3); margin-bottom: 14px;
|
|
526
|
+
}
|
|
527
|
+
footer .col a { display: block; color: var(--text-2); text-decoration: none; padding: 4px 0; transition: color var(--t-fast); }
|
|
528
|
+
footer .col a:hover { color: var(--gold-2); }
|
|
529
|
+
footer .legal {
|
|
530
|
+
margin-top: 30px; display: flex; justify-content: space-between; gap: 16px;
|
|
531
|
+
color: var(--text-3); font-size: 0.82rem; flex-wrap: wrap;
|
|
532
|
+
}
|
|
533
|
+
@media (max-width: 900px) { footer .row { grid-template-columns: 1fr 1fr; } }
|
|
534
|
+
|
|
535
|
+
/* ─────────────────────────────────────────────
|
|
536
|
+
SCROLL-TRIGGERED ANIMATION
|
|
537
|
+
───────────────────────────────────────────── */
|
|
538
|
+
[data-animate] { opacity: 0; transform: translateY(24px); transition: opacity var(--t-slow) var(--ease), transform var(--t-slow) var(--ease); }
|
|
539
|
+
[data-animate].in-view { opacity: 1; transform: translateY(0); }
|
|
540
|
+
</style>
|
|
541
|
+
</head>
|
|
542
|
+
<body>
|
|
543
|
+
|
|
544
|
+
<nav>
|
|
545
|
+
<div class="wrap">
|
|
546
|
+
<a href="/" class="brand">
|
|
547
|
+
<span class="logo">⚙</span>
|
|
548
|
+
cycle<em>CAD</em> suite
|
|
549
|
+
</a>
|
|
550
|
+
<div class="links">
|
|
551
|
+
<a href="/">Suite</a>
|
|
552
|
+
<a href="/explodeview.html">ExplodeView</a>
|
|
553
|
+
<a href="/pentacad.html">Pentacad</a>
|
|
554
|
+
<a href="#features">Features</a>
|
|
555
|
+
<a href="/app/" class="cta">Launch cycleCAD →</a>
|
|
556
|
+
</div>
|
|
557
|
+
</div>
|
|
558
|
+
</nav>
|
|
559
|
+
|
|
560
|
+
<!-- HERO -->
|
|
561
|
+
<header class="hero">
|
|
562
|
+
<div class="wrap">
|
|
563
|
+
<div>
|
|
564
|
+
<div class="kicker">
|
|
565
|
+
<span class="dot"></span>
|
|
566
|
+
Live · MIT · npm 3.11.0
|
|
567
|
+
</div>
|
|
568
|
+
<h1>
|
|
569
|
+
Parametric CAD that runs in a <em>browser</em>.<br/>
|
|
570
|
+
Real B-rep. No install.
|
|
571
|
+
</h1>
|
|
572
|
+
<p class="lead">
|
|
573
|
+
cycleCAD is the modelling core of the Suite. Thirteen sketch tools. Twelve constraint types.
|
|
574
|
+
Real B-rep booleans on OpenCascade.js. Assemblies with seven joint types. AI Copilot that
|
|
575
|
+
writes the geometry for you.
|
|
576
|
+
</p>
|
|
577
|
+
<div class="ctas">
|
|
578
|
+
<a href="/app/" class="btn btn-primary">Launch cycleCAD <span class="arrow">→</span></a>
|
|
579
|
+
<a href="#features" class="btn btn-secondary">See the features</a>
|
|
580
|
+
</div>
|
|
581
|
+
</div>
|
|
582
|
+
|
|
583
|
+
<div class="hero-visual" aria-hidden="true">
|
|
584
|
+
<svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
|
|
585
|
+
<defs>
|
|
586
|
+
<radialGradient id="cad-core" cx="50%" cy="50%">
|
|
587
|
+
<stop offset="0%" stop-color="#D4A843" stop-opacity="0.6"/>
|
|
588
|
+
<stop offset="70%" stop-color="#D4A843" stop-opacity="0.06"/>
|
|
589
|
+
<stop offset="100%" stop-color="#D4A843" stop-opacity="0"/>
|
|
590
|
+
</radialGradient>
|
|
591
|
+
</defs>
|
|
592
|
+
|
|
593
|
+
<!-- Outer dimension ring -->
|
|
594
|
+
<circle cx="150" cy="150" r="128" fill="none" stroke="#2A4F80" stroke-width="0.6"/>
|
|
595
|
+
<circle cx="150" cy="150" r="128" class="dim-line" fill="none" stroke="#D4A843" stroke-width="0.8" opacity="0.45"/>
|
|
596
|
+
|
|
597
|
+
<!-- Glow -->
|
|
598
|
+
<circle cx="150" cy="150" r="95" fill="url(#cad-core)"/>
|
|
599
|
+
|
|
600
|
+
<!-- Wireframe cube (isometric projection) -->
|
|
601
|
+
<g class="cube-spin">
|
|
602
|
+
<!-- back face -->
|
|
603
|
+
<polygon points="110,100 190,100 210,130 130,130" fill="none" stroke="#5A6B85" stroke-width="1" opacity="0.6"/>
|
|
604
|
+
<!-- front face -->
|
|
605
|
+
<polygon points="90,170 170,170 190,200 110,200" fill="none" stroke="#E8C065" stroke-width="1.4"/>
|
|
606
|
+
<!-- connecting edges -->
|
|
607
|
+
<line x1="110" y1="100" x2="90" y2="170" stroke="#8B9AB5" stroke-width="1"/>
|
|
608
|
+
<line x1="190" y1="100" x2="170" y2="170" stroke="#8B9AB5" stroke-width="1"/>
|
|
609
|
+
<line x1="210" y1="130" x2="190" y2="200" stroke="#8B9AB5" stroke-width="1"/>
|
|
610
|
+
<line x1="130" y1="130" x2="110" y2="200" stroke="#8B9AB5" stroke-width="1"/>
|
|
611
|
+
<!-- top face (highlight) -->
|
|
612
|
+
<polygon points="110,100 190,100 170,170 90,170" fill="rgba(212,168,67,0.08)" stroke="#D4A843" stroke-width="1.2" opacity="0.8"/>
|
|
613
|
+
|
|
614
|
+
<!-- vertices -->
|
|
615
|
+
<circle cx="110" cy="100" r="2.4" fill="#E8C065"/>
|
|
616
|
+
<circle cx="190" cy="100" r="2.4" fill="#E8C065"/>
|
|
617
|
+
<circle cx="210" cy="130" r="2.4" fill="#E8C065"/>
|
|
618
|
+
<circle cx="130" cy="130" r="2.4" fill="#E8C065"/>
|
|
619
|
+
<circle cx="90" cy="170" r="2.4" fill="#E8C065"/>
|
|
620
|
+
<circle cx="170" cy="170" r="2.4" fill="#E8C065"/>
|
|
621
|
+
<circle cx="190" cy="200" r="2.4" fill="#E8C065"/>
|
|
622
|
+
<circle cx="110" cy="200" r="2.4" fill="#E8C065"/>
|
|
623
|
+
</g>
|
|
624
|
+
|
|
625
|
+
<!-- Dimension lines -->
|
|
626
|
+
<g opacity="0.8">
|
|
627
|
+
<line x1="40" y1="240" x2="260" y2="240" class="dim-line" stroke="#2E86DE" stroke-width="0.8"/>
|
|
628
|
+
<line x1="40" y1="235" x2="40" y2="245" stroke="#2E86DE" stroke-width="0.8"/>
|
|
629
|
+
<line x1="260" y1="235" x2="260" y2="245" stroke="#2E86DE" stroke-width="0.8"/>
|
|
630
|
+
<text x="150" y="256" font-family="JetBrains Mono" font-size="10" fill="#2E86DE" text-anchor="middle">100.00 mm</text>
|
|
631
|
+
</g>
|
|
632
|
+
<g opacity="0.8">
|
|
633
|
+
<line x1="264" y1="60" x2="264" y2="230" class="dim-line" stroke="#3AAFA9" stroke-width="0.8"/>
|
|
634
|
+
<line x1="259" y1="60" x2="269" y2="60" stroke="#3AAFA9" stroke-width="0.8"/>
|
|
635
|
+
<line x1="259" y1="230" x2="269" y2="230" stroke="#3AAFA9" stroke-width="0.8"/>
|
|
636
|
+
<text x="278" y="150" font-family="JetBrains Mono" font-size="10" fill="#3AAFA9" text-anchor="middle" transform="rotate(90 278 150)">60.00 mm</text>
|
|
637
|
+
</g>
|
|
638
|
+
|
|
639
|
+
<!-- Axes -->
|
|
640
|
+
<g class="spark">
|
|
641
|
+
<line x1="150" y1="150" x2="200" y2="150" stroke="#EF4444" stroke-width="1.4"/>
|
|
642
|
+
<line x1="150" y1="150" x2="150" y2="100" stroke="#10B981" stroke-width="1.4"/>
|
|
643
|
+
<line x1="150" y1="150" x2="120" y2="180" stroke="#2E86DE" stroke-width="1.4"/>
|
|
644
|
+
<text x="204" y="154" font-family="JetBrains Mono" font-size="9" fill="#EF4444">X</text>
|
|
645
|
+
<text x="145" y="95" font-family="JetBrains Mono" font-size="9" fill="#10B981">Y</text>
|
|
646
|
+
<text x="112" y="188" font-family="JetBrains Mono" font-size="9" fill="#2E86DE">Z</text>
|
|
647
|
+
</g>
|
|
648
|
+
</svg>
|
|
649
|
+
</div>
|
|
650
|
+
</div>
|
|
651
|
+
</header>
|
|
652
|
+
|
|
653
|
+
<!-- PROBLEM STRIP -->
|
|
654
|
+
<section class="problem" data-animate>
|
|
655
|
+
<div class="wrap">
|
|
656
|
+
<h2>SolidWorks is <em>$4,495</em>. Fusion is $545/year. Onshape is $1,500/year.</h2>
|
|
657
|
+
<p class="sub">They all require an install, an account, a license server, and a lot of luck your machine is fast enough. You pay annually. You pay per seat. You pay whether you use it or not.</p>
|
|
658
|
+
<div class="problem-grid">
|
|
659
|
+
<div class="problem-card"><div class="icon">$$</div><div class="ttl">SolidWorks</div><div class="sub">~$4,495/yr</div></div>
|
|
660
|
+
<div class="problem-card"><div class="icon">$$</div><div class="ttl">Fusion 360</div><div class="sub">~$545/yr</div></div>
|
|
661
|
+
<div class="problem-card"><div class="icon">$$</div><div class="ttl">Onshape</div><div class="sub">~$1,500/yr</div></div>
|
|
662
|
+
<div class="problem-card"><div class="icon">$$</div><div class="ttl">CATIA</div><div class="sub">$10k+/yr</div></div>
|
|
663
|
+
<div class="problem-card"><div class="icon">$$</div><div class="ttl">Creo</div><div class="sub">~$2,400/yr</div></div>
|
|
664
|
+
</div>
|
|
665
|
+
<div class="vs-line">cycleCAD is free. Open source. In the browser.</div>
|
|
666
|
+
</div>
|
|
667
|
+
</section>
|
|
668
|
+
|
|
669
|
+
<!-- FIVE MODULES -->
|
|
670
|
+
<section class="solution" id="features" data-animate>
|
|
671
|
+
<div class="wrap">
|
|
672
|
+
<div class="header-block">
|
|
673
|
+
<span class="section-kicker">The Design Workspace</span>
|
|
674
|
+
<h2>Five modules. <em>One</em> browser tab.</h2>
|
|
675
|
+
<p class="sub">cycleCAD is the modelling stage of the Suite. It goes from empty sketch to parametric assembly to exported STEP — without leaving the browser, without installing a driver, without a license server.</p>
|
|
676
|
+
</div>
|
|
677
|
+
|
|
678
|
+
<div class="five-modules">
|
|
679
|
+
<div class="mod-card">
|
|
680
|
+
<div class="mod-num">01</div>
|
|
681
|
+
<h3>Sketch Engine</h3>
|
|
682
|
+
<p>Thirteen sketch tools, twelve constraint types, iterative relaxation solver. Grid snap, auto-inferred constraints, degree-of-freedom analysis.</p>
|
|
683
|
+
</div>
|
|
684
|
+
<div class="mod-card">
|
|
685
|
+
<div class="mod-num">02</div>
|
|
686
|
+
<h3>Solid Modeller</h3>
|
|
687
|
+
<p>Sixteen operations: extrude, revolve, sweep, loft, fillet, chamfer, shell, pattern, hole, thread, mirror, draft, scale, combine, split, boolean.</p>
|
|
688
|
+
</div>
|
|
689
|
+
<div class="mod-card">
|
|
690
|
+
<div class="mod-num">03</div>
|
|
691
|
+
<h3>Assembly Workspace</h3>
|
|
692
|
+
<p>Seven joint types with mate constraints. Explode, collapse, interference check, contact sets, motion study. Import Inventor .iam and .ipj.</p>
|
|
693
|
+
</div>
|
|
694
|
+
<div class="mod-card">
|
|
695
|
+
<div class="mod-num">04</div>
|
|
696
|
+
<h3>AI Copilot</h3>
|
|
697
|
+
<p>Natural-language → geometry. Eight template families cover common parts; LLM planner handles everything else. Multi-step plans up to twenty steps.</p>
|
|
698
|
+
</div>
|
|
699
|
+
<div class="mod-card">
|
|
700
|
+
<div class="mod-num">05</div>
|
|
701
|
+
<h3>Agent API</h3>
|
|
702
|
+
<p>Fifty-five commands across ten namespaces. JSON-RPC surface scriptable from the browser console, MCP server, REST API, or CLI.</p>
|
|
703
|
+
</div>
|
|
704
|
+
</div>
|
|
705
|
+
</div>
|
|
706
|
+
</section>
|
|
707
|
+
|
|
708
|
+
<!-- SKETCH + CONSTRAINTS -->
|
|
709
|
+
<section class="strategies" id="strategies" data-animate>
|
|
710
|
+
<div class="wrap">
|
|
711
|
+
<div class="header-block">
|
|
712
|
+
<span class="section-kicker">Sketch Engine</span>
|
|
713
|
+
<h2>Twelve constraints. <em>Real</em> solver.</h2>
|
|
714
|
+
<p class="sub">A proper iterative constraint solver — not a trick, not a cheat. Auto-infers constraints as you sketch, does degree-of-freedom analysis, and tells you when a sketch is fully defined.</p>
|
|
715
|
+
</div>
|
|
716
|
+
|
|
717
|
+
<div class="strat-grid">
|
|
718
|
+
|
|
719
|
+
<div class="strat-card">
|
|
720
|
+
<div class="icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M12 12 L20 4"/></svg></div>
|
|
721
|
+
<h4>Coincident</h4>
|
|
722
|
+
<div class="kind">Point · Geometric</div>
|
|
723
|
+
<p>Lock a point to another point, line, arc, or circle. The default constraint, applied on pick.</p>
|
|
724
|
+
</div>
|
|
725
|
+
|
|
726
|
+
<div class="strat-card">
|
|
727
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M3 12h18"/></svg></div>
|
|
728
|
+
<h4>Horizontal</h4>
|
|
729
|
+
<div class="kind">Line · Geometric</div>
|
|
730
|
+
<p>Force a line to align with the X axis. Applies across a chain of lines if selected together.</p>
|
|
731
|
+
</div>
|
|
732
|
+
|
|
733
|
+
<div class="strat-card">
|
|
734
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M12 3v18"/></svg></div>
|
|
735
|
+
<h4>Vertical</h4>
|
|
736
|
+
<div class="kind">Line · Geometric</div>
|
|
737
|
+
<p>Force a line to align with the Y axis. Complementary to horizontal, both can coexist in a sketch.</p>
|
|
738
|
+
</div>
|
|
739
|
+
|
|
740
|
+
<div class="strat-card">
|
|
741
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M4 7 L20 7 M4 17 L20 17"/></svg></div>
|
|
742
|
+
<h4>Parallel</h4>
|
|
743
|
+
<div class="kind">Line · Geometric</div>
|
|
744
|
+
<p>Keep two lines at the same angle without fixing that angle. The solver preserves it through edits.</p>
|
|
745
|
+
</div>
|
|
746
|
+
|
|
747
|
+
<div class="strat-card">
|
|
748
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M4 20 L20 4 M4 4 L20 20"/></svg></div>
|
|
749
|
+
<h4>Perpendicular</h4>
|
|
750
|
+
<div class="kind">Line · Geometric</div>
|
|
751
|
+
<p>Lock two lines at exactly 90°. Works with tilted sketches — the right angle is preserved.</p>
|
|
752
|
+
</div>
|
|
753
|
+
|
|
754
|
+
<div class="strat-card">
|
|
755
|
+
<div class="icon"><svg viewBox="0 0 24 24"><circle cx="10" cy="14" r="5"/><path d="M15 14 L22 7"/></svg></div>
|
|
756
|
+
<h4>Tangent</h4>
|
|
757
|
+
<div class="kind">Line · Arc · Circle</div>
|
|
758
|
+
<p>Touch a line or curve to an arc or circle at exactly one point. Auto-inferred on drag near a curve.</p>
|
|
759
|
+
</div>
|
|
760
|
+
|
|
761
|
+
<div class="strat-card">
|
|
762
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M4 6 L10 6 M14 6 L20 6 M4 18 L10 18 M14 18 L20 18"/></svg></div>
|
|
763
|
+
<h4>Equal</h4>
|
|
764
|
+
<div class="kind">Line · Arc</div>
|
|
765
|
+
<p>Two lines the same length, two arcs the same radius. Creates links the solver maintains.</p>
|
|
766
|
+
</div>
|
|
767
|
+
|
|
768
|
+
<div class="strat-card">
|
|
769
|
+
<div class="icon"><svg viewBox="0 0 24 24"><rect x="9" y="9" width="6" height="6"/><path d="M4 4 L9 9 M20 20 L15 15"/></svg></div>
|
|
770
|
+
<h4>Fixed</h4>
|
|
771
|
+
<div class="kind">Point · Ground</div>
|
|
772
|
+
<p>Pin a point to its current position. Fully defining a sketch usually starts with one fixed point.</p>
|
|
773
|
+
</div>
|
|
774
|
+
|
|
775
|
+
<div class="strat-card">
|
|
776
|
+
<div class="icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="3"/></svg></div>
|
|
777
|
+
<h4>Concentric</h4>
|
|
778
|
+
<div class="kind">Arc · Circle</div>
|
|
779
|
+
<p>Lock two arcs or circles to share a centre. Classic for bolt-hole patterns and coaxial bores.</p>
|
|
780
|
+
</div>
|
|
781
|
+
|
|
782
|
+
<div class="strat-card">
|
|
783
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M12 2 L12 22 M4 8 L10 8 M14 8 L20 8 M4 16 L10 16 M14 16 L20 16"/></svg></div>
|
|
784
|
+
<h4>Symmetric</h4>
|
|
785
|
+
<div class="kind">Point · Line</div>
|
|
786
|
+
<p>Mirror two points across a reference line. Edit one side, the other follows.</p>
|
|
787
|
+
</div>
|
|
788
|
+
|
|
789
|
+
<div class="strat-card">
|
|
790
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M4 12 L20 12 M4 8 L4 16 M20 8 L20 16"/><text x="8" y="10" font-size="5" font-family="monospace" stroke="none" fill="#E8C065">42</text></svg></div>
|
|
791
|
+
<h4>Distance</h4>
|
|
792
|
+
<div class="kind">Point · Line · Dim</div>
|
|
793
|
+
<p>Fix a numeric distance between two entities. The dimension is parametric and editable.</p>
|
|
794
|
+
</div>
|
|
795
|
+
|
|
796
|
+
<div class="strat-card">
|
|
797
|
+
<div class="icon"><svg viewBox="0 0 24 24"><path d="M4 20 L20 20 M4 20 L12 6 M10 15 A4 4 0 0 0 14 15"/></svg></div>
|
|
798
|
+
<h4>Angle</h4>
|
|
799
|
+
<div class="kind">Line · Dim</div>
|
|
800
|
+
<p>Fix a numeric angle between two lines. Solver re-orients both to satisfy the constraint network.</p>
|
|
801
|
+
</div>
|
|
802
|
+
|
|
803
|
+
</div>
|
|
804
|
+
</div>
|
|
805
|
+
</section>
|
|
806
|
+
|
|
807
|
+
<!-- B-REP KERNEL -->
|
|
808
|
+
<section class="post-section" data-animate>
|
|
809
|
+
<div class="wrap post-layout">
|
|
810
|
+
<div class="post-body">
|
|
811
|
+
<span class="section-kicker">B-rep Kernel</span>
|
|
812
|
+
<h2>Real B-rep. <em>Real</em> booleans.</h2>
|
|
813
|
+
<p>Under the hood cycleCAD runs OpenCascade.js — the same CAD kernel the pros use. Your extrudes, fillets, and booleans produce real topology, not mesh approximations.</p>
|
|
814
|
+
<p>Round-trip to STEP preserves the feature tree. Round-trip to IGES preserves NURBS. Round-trip to GLB gives you a tessellated mesh suitable for the web — all from the same parametric source.</p>
|
|
815
|
+
<ul class="feature-list">
|
|
816
|
+
<li>Real topology: <code class="inline">faces</code>, <code class="inline">edges</code>, <code class="inline">vertices</code>, <code class="inline">loops</code></li>
|
|
817
|
+
<li>Real booleans: <code class="inline">union</code>, <code class="inline">cut</code>, <code class="inline">intersect</code> — no mesh approximation</li>
|
|
818
|
+
<li>Real fillets and chamfers — edge-based, preserves parametric intent</li>
|
|
819
|
+
<li>STEP ↔ IGES ↔ GLB round-trip via converter server</li>
|
|
820
|
+
<li>Incremental rebuild on parameter change</li>
|
|
821
|
+
</ul>
|
|
822
|
+
</div>
|
|
823
|
+
|
|
824
|
+
<div class="ngc-block">
|
|
825
|
+
<div class="hd">
|
|
826
|
+
<span class="dots"><span></span><span></span><span></span></span>
|
|
827
|
+
<span>cycleCAD feature tree — live from the browser</span>
|
|
828
|
+
</div>
|
|
829
|
+
<pre><span class="cm">// cycleCAD Agent API · window.cycleCAD.execute</span>
|
|
830
|
+
<span class="cm">// Mounting plate with four-hole pattern</span>
|
|
831
|
+
|
|
832
|
+
<span class="kw">const</span> plate = <span class="kw">await</span> cycleCAD.execute({
|
|
833
|
+
method: <span class="str">'sketch.rect'</span>,
|
|
834
|
+
params: { width: <span class="val">100</span>, height: <span class="val">60</span> }
|
|
835
|
+
});
|
|
836
|
+
|
|
837
|
+
<span class="kw">await</span> cycleCAD.execute({
|
|
838
|
+
method: <span class="str">'ops.extrude'</span>,
|
|
839
|
+
params: { depth: <span class="val">5</span> }
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
<span class="kw">const</span> holes = <span class="kw">await</span> cycleCAD.execute({
|
|
843
|
+
method: <span class="str">'ops.pattern'</span>,
|
|
844
|
+
params: { count: <span class="val">4</span>, spacingX: <span class="val">80</span> }
|
|
845
|
+
});
|
|
846
|
+
|
|
847
|
+
<span class="kw">await</span> cycleCAD.execute({
|
|
848
|
+
method: <span class="str">'export.step'</span>,
|
|
849
|
+
params: { filename: <span class="str">'plate.step'</span> }
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
<span class="cm">// → B-rep solid · 4 holes · STEP-ready</span></pre>
|
|
853
|
+
</div>
|
|
854
|
+
</div>
|
|
855
|
+
</section>
|
|
856
|
+
|
|
857
|
+
<!-- AI COPILOT SHOWCASE -->
|
|
858
|
+
<section class="sim-section" data-animate>
|
|
859
|
+
<div class="wrap sim-layout">
|
|
860
|
+
<div class="sim-visual" aria-hidden="true">
|
|
861
|
+
<div class="copilot-term">
|
|
862
|
+
<div class="term-hd">
|
|
863
|
+
<span class="dots"><span></span><span></span><span></span></span>
|
|
864
|
+
<span>ai copilot</span>
|
|
865
|
+
<span class="ti">claude sonnet 4.6</span>
|
|
866
|
+
</div>
|
|
867
|
+
<div class="prompt"><span class="tin">draw a flange 80mm OD with 4 bolt holes</span><span class="cursor"></span></div>
|
|
868
|
+
<div class="step s1"><span class="chk">✓</span><span><span class="kw">sketch.circle</span> · Ø <span class="val">80</span></span></div>
|
|
869
|
+
<div class="step s2"><span class="chk">✓</span><span><span class="kw">ops.extrude</span> · depth <span class="val">10</span> mm</span></div>
|
|
870
|
+
<div class="step s3"><span class="chk">✓</span><span><span class="kw">sketch.circle</span> · bolt circle Ø <span class="val">60</span></span></div>
|
|
871
|
+
<div class="step s4"><span class="chk">✓</span><span><span class="kw">ops.hole</span> · <span class="val">4</span> × Ø <span class="val">8.5</span></span></div>
|
|
872
|
+
<div class="step s5"><span class="chk">✓</span><span><span class="kw">view.fit</span> · iso</span></div>
|
|
873
|
+
<div class="result">flange · 80 × 10 · 4-bolt PCD 60 · ready</div>
|
|
874
|
+
</div>
|
|
875
|
+
</div>
|
|
876
|
+
|
|
877
|
+
<div class="sim-body">
|
|
878
|
+
<span class="section-kicker">AI Copilot</span>
|
|
879
|
+
<h2>Type a prompt. <em>Get</em> geometry.</h2>
|
|
880
|
+
<p>Describe what you want in plain English. The Copilot parses your intent, picks the right template or asks an LLM to plan it, and executes the plan step-by-step in the scene. Every geometry operation uses the real kernel.</p>
|
|
881
|
+
<p>Common parts use offline templates — no API key needed. Novel geometry routes to a large language model that returns a plan the Copilot validates and runs.</p>
|
|
882
|
+
<ul class="feature-list">
|
|
883
|
+
<li>Eight template families: Pi cases, nuts, washers, flanges, threaded rod, gears, pulleys, bearings + housings</li>
|
|
884
|
+
<li>Plus T-slot extrusions, U-brackets, L-brackets, plates, boxes</li>
|
|
885
|
+
<li>Multi-step plans up to twenty operations with rollback</li>
|
|
886
|
+
<li>Works offline with templates — no API key required for common parts</li>
|
|
887
|
+
<li>Gemini 2.0 Flash · Groq Llama 3.3 70B · Claude Sonnet 4.6</li>
|
|
888
|
+
<li>Self-correcting: watches for errors and auto-recovers</li>
|
|
889
|
+
</ul>
|
|
890
|
+
</div>
|
|
891
|
+
</div>
|
|
892
|
+
</section>
|
|
893
|
+
|
|
894
|
+
<!-- AGENT API -->
|
|
895
|
+
<section class="bridge" data-animate>
|
|
896
|
+
<div class="wrap">
|
|
897
|
+
<div class="header-block">
|
|
898
|
+
<span class="section-kicker">Agent API</span>
|
|
899
|
+
<h2>cycleCAD is for <em>agents</em>, too.</h2>
|
|
900
|
+
<p class="sub">A JSON-RPC surface covering every geometry, query, and export operation. Fifty-five commands across ten namespaces. Scripted from the browser console, the MCP server, the REST API, or the command line via <code style="color: var(--gold-2); background: var(--bg-card); padding: 2px 7px; border-radius: 4px; font-size: 0.88em;">npx cyclecad</code>.</p>
|
|
901
|
+
</div>
|
|
902
|
+
|
|
903
|
+
<div class="bridge-diagram">
|
|
904
|
+
<div class="bridge-row">
|
|
905
|
+
<div class="bridge-node">
|
|
906
|
+
<div class="icn">🤖</div>
|
|
907
|
+
<h4>Agent</h4>
|
|
908
|
+
<div class="ttag">Any LLM or script</div>
|
|
909
|
+
</div>
|
|
910
|
+
<div class="bridge-arrow"><div class="packet"></div><div class="packet p2"></div></div>
|
|
911
|
+
<div class="bridge-node">
|
|
912
|
+
<div class="icn">🔌</div>
|
|
913
|
+
<h4>cycleCAD API</h4>
|
|
914
|
+
<div class="ttag">JSON-RPC · 55 commands</div>
|
|
915
|
+
</div>
|
|
916
|
+
<div class="bridge-arrow"><div class="packet"></div><div class="packet p2"></div></div>
|
|
917
|
+
<div class="bridge-node">
|
|
918
|
+
<div class="icn">📐</div>
|
|
919
|
+
<h4>3D Scene</h4>
|
|
920
|
+
<div class="ttag">B-rep · Three.js · live</div>
|
|
921
|
+
</div>
|
|
922
|
+
</div>
|
|
923
|
+
|
|
924
|
+
<div class="bridge-caption">
|
|
925
|
+
Call <code>window.cycleCAD.execute({ method, params })</code>. Self-describing schema via <code>getSchema()</code>.
|
|
926
|
+
</div>
|
|
927
|
+
|
|
928
|
+
<div class="namespaces">
|
|
929
|
+
<span class="ns-chip"><span class="ns-dot">●</span> sketch.<span class="ns-dot">*</span></span>
|
|
930
|
+
<span class="ns-chip"><span class="ns-dot">●</span> ops.<span class="ns-dot">*</span></span>
|
|
931
|
+
<span class="ns-chip"><span class="ns-dot">●</span> assembly.<span class="ns-dot">*</span></span>
|
|
932
|
+
<span class="ns-chip"><span class="ns-dot">●</span> view.<span class="ns-dot">*</span></span>
|
|
933
|
+
<span class="ns-chip"><span class="ns-dot">●</span> query.<span class="ns-dot">*</span></span>
|
|
934
|
+
<span class="ns-chip"><span class="ns-dot">●</span> validate.<span class="ns-dot">*</span></span>
|
|
935
|
+
<span class="ns-chip"><span class="ns-dot">●</span> export.<span class="ns-dot">*</span></span>
|
|
936
|
+
<span class="ns-chip"><span class="ns-dot">●</span> import.<span class="ns-dot">*</span></span>
|
|
937
|
+
<span class="ns-chip"><span class="ns-dot">●</span> render.<span class="ns-dot">*</span></span>
|
|
938
|
+
<span class="ns-chip"><span class="ns-dot">●</span> file.<span class="ns-dot">*</span></span>
|
|
939
|
+
</div>
|
|
940
|
+
</div>
|
|
941
|
+
</div>
|
|
942
|
+
</section>
|
|
943
|
+
|
|
944
|
+
<!-- ROADMAP -->
|
|
945
|
+
<section class="roadmap" data-animate>
|
|
946
|
+
<div class="wrap">
|
|
947
|
+
<div class="header-block">
|
|
948
|
+
<span class="section-kicker">Roadmap</span>
|
|
949
|
+
<h2>Phased. <em>Honest</em> about where we are.</h2>
|
|
950
|
+
<p class="sub">The core is shipped and running in production. Engineering analysis is the active sprint. Real-time collaboration and a plugin marketplace are on deck.</p>
|
|
951
|
+
</div>
|
|
952
|
+
|
|
953
|
+
<div class="phases">
|
|
954
|
+
<div class="phase done">
|
|
955
|
+
<div class="phase-dot"></div>
|
|
956
|
+
<span class="phase-num">Done</span>
|
|
957
|
+
<h4>Phase 0 · Core</h4>
|
|
958
|
+
<ul>
|
|
959
|
+
<li>Browser-native UI</li>
|
|
960
|
+
<li>45 modules</li>
|
|
961
|
+
<li>138 MB STEP import</li>
|
|
962
|
+
<li>AI Copilot core</li>
|
|
963
|
+
<li>Agent API · 55 commands</li>
|
|
964
|
+
<li>MCP server · REST API · CLI</li>
|
|
965
|
+
</ul>
|
|
966
|
+
</div>
|
|
967
|
+
|
|
968
|
+
<div class="phase active">
|
|
969
|
+
<div class="phase-dot"></div>
|
|
970
|
+
<span class="phase-num">In progress</span>
|
|
971
|
+
<h4>Phase 1 · Engineering Analyst</h4>
|
|
972
|
+
<ul>
|
|
973
|
+
<li>Bolted-joint analysis ✓</li>
|
|
974
|
+
<li>Gear (AGMA bending + pitting)</li>
|
|
975
|
+
<li>Shaft (Goodman / Soderberg)</li>
|
|
976
|
+
<li>Bearings (L10 life)</li>
|
|
977
|
+
<li>Welds (throat stress)</li>
|
|
978
|
+
</ul>
|
|
979
|
+
</div>
|
|
980
|
+
|
|
981
|
+
<div class="phase next">
|
|
982
|
+
<div class="phase-dot"></div>
|
|
983
|
+
<span class="phase-num">Next</span>
|
|
984
|
+
<h4>Phase 2 · Intelligence</h4>
|
|
985
|
+
<ul>
|
|
986
|
+
<li>Text-to-CAD live preview</li>
|
|
987
|
+
<li>Photo-to-CAD reverse engineering</li>
|
|
988
|
+
<li>DFM checker</li>
|
|
989
|
+
<li>Generative design</li>
|
|
990
|
+
<li>RAG-cited engineering references</li>
|
|
991
|
+
</ul>
|
|
992
|
+
</div>
|
|
993
|
+
|
|
994
|
+
<div class="phase next">
|
|
995
|
+
<div class="phase-dot"></div>
|
|
996
|
+
<span class="phase-num">Later</span>
|
|
997
|
+
<h4>Phase 3 · Platform</h4>
|
|
998
|
+
<ul>
|
|
999
|
+
<li>Real-time collaboration</li>
|
|
1000
|
+
<li>Plugin marketplace</li>
|
|
1001
|
+
<li>Cloud storage</li>
|
|
1002
|
+
<li>Enterprise SSO</li>
|
|
1003
|
+
<li>Self-hosted enterprise builds</li>
|
|
1004
|
+
</ul>
|
|
1005
|
+
</div>
|
|
1006
|
+
</div>
|
|
1007
|
+
</div>
|
|
1008
|
+
</section>
|
|
1009
|
+
|
|
1010
|
+
<!-- FINAL CTA -->
|
|
1011
|
+
<section class="cta-final">
|
|
1012
|
+
<div class="wrap">
|
|
1013
|
+
<h2>Ship models. <em>Not</em> licence-server tickets.</h2>
|
|
1014
|
+
<p>Open cycleCAD in the browser. Start a sketch. Extrude, fillet, assemble. Export STEP. No install. No account. MIT-licensed, forever.</p>
|
|
1015
|
+
<div class="ctas">
|
|
1016
|
+
<a href="/app/" class="btn btn-primary">Launch cycleCAD <span class="arrow">→</span></a>
|
|
1017
|
+
<a href="https://github.com/vvlars-cmd/cyclecad" class="btn btn-secondary">View on GitHub</a>
|
|
1018
|
+
<a href="https://www.npmjs.com/package/cyclecad" class="btn btn-secondary">View on npm</a>
|
|
1019
|
+
</div>
|
|
1020
|
+
<div class="tiny">
|
|
1021
|
+
cycleCAD is <strong>MIT</strong>-licensed. Part of the <a href="/">cycleCAD Suite</a>.
|
|
1022
|
+
</div>
|
|
1023
|
+
</div>
|
|
1024
|
+
</section>
|
|
1025
|
+
|
|
1026
|
+
<!-- FOOTER -->
|
|
1027
|
+
<footer>
|
|
1028
|
+
<div class="wrap">
|
|
1029
|
+
<div class="row">
|
|
1030
|
+
<div class="col brand-col">
|
|
1031
|
+
<span class="brand">cycle<em>CAD</em> suite</span>
|
|
1032
|
+
<p>From idea to finished part, in one browser tab. Open-source CAD for designers, makers, and CNC shops.</p>
|
|
1033
|
+
</div>
|
|
1034
|
+
<div class="col">
|
|
1035
|
+
<h4>Products</h4>
|
|
1036
|
+
<a href="/app/">cycleCAD</a>
|
|
1037
|
+
<a href="https://explodeview.com/">ExplodeView</a>
|
|
1038
|
+
<a href="/pentacad.html">Pentacad</a>
|
|
1039
|
+
</div>
|
|
1040
|
+
<div class="col">
|
|
1041
|
+
<h4>Resources</h4>
|
|
1042
|
+
<a href="https://github.com/vvlars-cmd/cyclecad#readme">Documentation</a>
|
|
1043
|
+
<a href="https://github.com/vvlars-cmd/cyclecad/blob/main/cycleCAD-Architecture.pptx">Architecture</a>
|
|
1044
|
+
<a href="https://github.com/vvlars-cmd/cyclecad/blob/main/docs/API-REFERENCE.md">API reference</a>
|
|
1045
|
+
</div>
|
|
1046
|
+
<div class="col">
|
|
1047
|
+
<h4>Developers</h4>
|
|
1048
|
+
<a href="https://github.com/vvlars-cmd/cyclecad">GitHub</a>
|
|
1049
|
+
<a href="https://www.npmjs.com/package/cyclecad">npm</a>
|
|
1050
|
+
<a href="https://github.com/vvlars-cmd/cyclecad/blob/main/server/mcp-server.js">MCP server</a>
|
|
1051
|
+
</div>
|
|
1052
|
+
<div class="col">
|
|
1053
|
+
<h4>Contact</h4>
|
|
1054
|
+
<a href="mailto:sachin.kumar@cyclewash.com">Email</a>
|
|
1055
|
+
<a href="https://cyclewash.de/en">cycleWASH</a>
|
|
1056
|
+
</div>
|
|
1057
|
+
</div>
|
|
1058
|
+
<div class="legal">
|
|
1059
|
+
<span>© 2026 cycleCAD Suite · Sachin Kumar</span>
|
|
1060
|
+
<span>cycleCAD MIT · ExplodeView MIT · Pentacad AGPL-3.0</span>
|
|
1061
|
+
</div>
|
|
1062
|
+
</div>
|
|
1063
|
+
</footer>
|
|
1064
|
+
|
|
1065
|
+
<script>
|
|
1066
|
+
(() => {
|
|
1067
|
+
const els = document.querySelectorAll('[data-animate]');
|
|
1068
|
+
const obs = new IntersectionObserver((entries) => {
|
|
1069
|
+
entries.forEach((e) => {
|
|
1070
|
+
if (e.isIntersecting) {
|
|
1071
|
+
e.target.classList.add('in-view');
|
|
1072
|
+
obs.unobserve(e.target);
|
|
1073
|
+
}
|
|
1074
|
+
});
|
|
1075
|
+
}, { threshold: 0.12 });
|
|
1076
|
+
els.forEach((el) => obs.observe(el));
|
|
1077
|
+
})();
|
|
1078
|
+
</script>
|
|
1079
|
+
|
|
1080
|
+
</body>
|
|
1081
|
+
</html>
|